/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package RRHH_controlador;

import CONTABILIDAD_MODELO.CON_DATOS_EMPRESA;
import Conexion.Conexion;
import RRHH_Modelo.RHH_BONO_ANTIGUEDAD;
import RRHH_Modelo.RHH_CARGO_DEP_REG_SUC;
import RRHH_Modelo.RHH_CREDITO_FISCAL;
import RRHH_Modelo.RHH_DEPARTAMENTO;
import RRHH_Modelo.RHH_EVENTOS_HITO;
import RRHH_Modelo.RHH_FECHAS_HITO;
import RRHH_Modelo.RHH_PERSONA;
import RRHH_Modelo.RHH_PLANILLA_EMPLEADOS;
import RRHH_Modelo.RHH_PLANILLA_FINIQUITO;
import RRHH_Modelo.RHH_PLANILLA_FINIQUITO_CABECE;
import RRHH_Modelo.RHH_QUINQUENIO;
import RRHH_Modelo.RHH_REGIONAL;
import RRHH_Modelo.RHH_SALARIO_MINIMO;
import RRHH_Modelo.RHH_SUCURSAL;
import RRHH_Modelo.RHH_USUARIO;
import RRHH_Modelo.RHH_VACACIONES;
import RRHH_Modelo.RHH_VACACIONES_PARAMETRIZACION;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author equipo_4
 */
@WebServlet(name = "RRHH_PLANILLA_FINIQUITOS_CONTROLLER", urlPatterns = {"/RRHH_PLANILLA_FINIQUITOS_CONTROLLER"})
public class RRHH_PLANILLA_FINIQUITOS_CONTROLLER extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /* TODO output your page here. You may use following sample code. */
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet RRHH_PLANILLA_FINIQUITOS_CONTROLLER</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet RRHH_PLANILLA_FINIQUITOS_CONTROLLER at " + request.getContextPath() + "</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            RHH_USUARIO usuario = ((RHH_USUARIO)request.getSession().getAttribute("usr"));
            Conexion con = new Conexion(usuario.getUSUARIO(), usuario.getPASSWORD());
            String evento = request.getParameter("evento");
            String html="";
            
            switch(evento)
            {
                case "cargar":
                    html=cargar(request,con);
                    break;
                case "estado":
                    html=estado(request,con);
                    break;
                case "cerrar":
                    html=cerrar(request,con);
                    break;
                case "calcular_fila":
                    html=calcular_fila(request,con);
                    break;
            }
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/plain");
            response.getWriter().write(html);
            con.Close();
        } catch (SQLException ex) {
            Logger.getLogger(RRHH_PLANILLA_FINIQUITOS_CONTROLLER.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private String cargar(HttpServletRequest request, Conexion con) throws SQLException {
        int ano=Integer.parseInt(request.getParameter("ano"));
        int mes=Integer.parseInt(request.getParameter("mes"));  
        int id_cabecera=0;
        RHH_PLANILLA_FINIQUITO_CABECE cabe = new RHH_PLANILLA_FINIQUITO_CABECE(con).Buscar(mes,ano);
        if(cabe!=null)
            id_cabecera=cabe.getID();
        else
        {
            cabe = new RHH_PLANILLA_FINIQUITO_CABECE(0, ano, mes, 1);
            cabe.setCon(con);
            id_cabecera=cabe.Insertar();
        }
        
        List<RHH_PLANILLA_FINIQUITO> lista_planilla = new RHH_PLANILLA_FINIQUITO(con).BuscarxCabecera(id_cabecera);
        
        if(lista_planilla.size()>0)
        {
            if(cabe.getESTADO()==1)
                return calcular(mes, ano,id_cabecera, con);
            else
                return abrir(mes, ano,id_cabecera, con);
                
        }
        else
            return calcular(mes, ano,id_cabecera, con);
    }
    
    private String calcular(int mes, int ano, int id_cabecera, Conexion con) throws SQLException
    {
        String mess ="";
        if(mes<10)
            mess="0"+mes;
        else
            mess=mes+"";         
        
        List<RHH_FECHAS_HITO> lista = new RHH_FECHAS_HITO(con).Retirados(mess,ano);
        String html="";
        new RHH_PLANILLA_FINIQUITO(con).Eliminar(id_cabecera);
        for(RHH_FECHAS_HITO fecha:lista)
        {
            RHH_PLANILLA_FINIQUITO planilla = new RHH_PLANILLA_FINIQUITO(con);
            planilla.setID_USUARIO(fecha.getID_USUARIO());
            planilla.setID_CABECERA(id_cabecera);
            RHH_PERSONA per = new RHH_PERSONA(con).BuscarxID_Usuario(fecha.getID_USUARIO());
            List<RHH_EVENTOS_HITO> evento_list = new RHH_EVENTOS_HITO(con).TodosRetiro();
            html+="<tr>";
            html+="<td>"+per.getCI()+"</td>";
            html+="<td>"+per.getPRIMER_NOMBRE()+" "+per.getSEGUNDO_NOMBRE()+"</td>";
            html+="<td>"+per.getPRIMER_APELLIDO()+" "+per.getSEGUNDO_APELLIDO()+"</td>";
            
            RHH_USUARIO usu = new RHH_USUARIO(con).BuscarXid(fecha.getID_USUARIO());
            RHH_CARGO_DEP_REG_SUC cdrs = new RHH_CARGO_DEP_REG_SUC(con).BuscarXCargos(usu.getID_CARGO());
            
            RHH_DEPARTAMENTO depto = new RHH_DEPARTAMENTO(con).BuscarXid(cdrs.getID_DEPTO());
            RHH_REGIONAL reg = new RHH_REGIONAL(con).BuscarXid(cdrs.getID_REGIONAL());
            RHH_SUCURSAL suc = new RHH_SUCURSAL(con).BuscarXid(cdrs.getID_SUCURSAL());
            
            if(depto!=null)
            {
                planilla.setDEPARTAMENTO((int)depto.getID());
                html+="<td>"+depto.getDESCRIPCION()+"</td>";
            }
            else
            {
                planilla.setDEPARTAMENTO(0);
                html+="<td>***</td>";
            }
            
            if(reg!=null)
            {
                planilla.setREGIONAL((int)reg.getID());
                html+="<td>"+reg.getDESCRIPCION()+"</td>";
            }
            else
            {
                planilla.setREGIONAL(0);
                html+="<td>***</td>";
            }
            
            if(suc!=null)
            {
                planilla.setSUCURSAL((int)suc.getID());
                html+="<td>"+suc.getDESCRIPCION()+"</td>";
            }
            else
            {
                planilla.setSUCURSAL(0);
                html+="<td>***</td>";
            }
            
            RHH_FECHAS_HITO fechain = new RHH_FECHAS_HITO(con).BuscarxUsuarioEvento(3 ,fecha.getID_USUARIO());
            html+="<td>"+fechain.getFECHA()+"</td>";
            planilla.setFECHA_CONTRATACION(fechain.getFECHAinDate());
            html+="<td>"+fecha.getFECHA()+"</td>";
            planilla.setFECHA_RETIRO(fecha.getFECHAinDate());
            html+="<td><select onchange='calcular_fila(this, "+fecha.getID()+");'>";
            planilla.setMOTIVO(fecha.getID_EVENTO_HITO());
            for(RHH_EVENTOS_HITO evento:evento_list)
            {
                if(evento.getID()==fecha.getID_EVENTO_HITO())
                    html+="<option value='"+evento.getID()+"' selected>"+evento.getDESCRIPCION()+"</option>";
                else
                    html+="<option value='"+evento.getID()+"'>"+evento.getDESCRIPCION()+"</option>";
            }
            html+="</select></td>";

            long milis1 = fechain.getFECHAinDate().getTime();
            long milis2 = fecha.getFECHAinDate().getTime();
            long diff = milis2 - milis1;
            if(diff<0)
                continue;

            long diffDays = diff / (24 * 60 * 60 * 1000);

            int ano_bono = (int) (diffDays/365);

            RHH_BONO_ANTIGUEDAD banti = new RHH_BONO_ANTIGUEDAD(con).sacarPorcentaje(ano_bono);
            double porcentaje_antiguedad = banti.getPORCENTAJE()/100;
            int multiplic = new CON_DATOS_EMPRESA(con).Buscar().getBONO_ANTIGUEDAD();
            double salariominimo_nal = new RHH_SALARIO_MINIMO(con).salarioActual();
            double Bono_Antiguedad = porcentaje_antiguedad*(multiplic*salariominimo_nal);   
            html+="<td>"+Bono_Antiguedad+"</td>";
            planilla.setBONO_ANTIGUEDAD(Bono_Antiguedad);
            
            double salario = new RHH_FECHAS_HITO(con).salarioUsuario(fecha.getID_USUARIO());
            planilla.setSALARIO(salario);
            html+="<td>"+salario+"</td>";
            Calendar cal = new GregorianCalendar();
            
            double prom_salario = new RHH_PLANILLA_EMPLEADOS(con).Promedio3Salarios(fecha.getID_USUARIO(), (cal.get(Calendar.MONTH)+1), cal.get(Calendar.YEAR));
            double desahucio=0.0; 
            
            if(fecha.getID_EVENTO_HITO()==1)
            {         
                desahucio=prom_salario*3;
                desahucio=Math.round(desahucio*100)/100;
                html+="<td>"+desahucio+"</td>";                
            }
            else
            {
                html+="<td>"+desahucio+"</td>";
            }     
            
            planilla.setDESAHUCIO(desahucio);

            int cantidad_quinquenios=new RHH_QUINQUENIO(con).CantidadQuinquenios(fecha.getID_USUARIO());

            Calendar calendario = new GregorianCalendar();
            calendario.set(Calendar.YEAR,0);
            calendario.set(Calendar.MONTH,0);
            calendario.set(Calendar.DAY_OF_MONTH, 1);

            int anof = 0;
            int mesf = 0;
            int diaf = 0;                        
            Date ingreso = new RHH_FECHAS_HITO(con).BuscarxUsuarioEvento(3, fecha.getID_USUARIO()).getFECHAinDate();
            if(ingreso!=null)
            {
                Date fecha1=ingreso;
                Date fecha2=fecha.getFECHAinDate();
                long diferencia = fecha2.getTime()-fecha1.getTime();
                int dia = (int)(diferencia/(3600000*24));                           
                calendario.add(Calendar.DAY_OF_MONTH, dia);
                if(dia<365)
                    anof=0;
                else
                    anof=calendario.get(Calendar.YEAR);

                mesf = calendario.get(Calendar.MONTH);
                diaf = calendario.get(Calendar.DAY_OF_MONTH);
            }

            double anos_indenizacion_a_pagar=anof-(cantidad_quinquenios*5);
            double meses_indenizacion_a_pagar=prom_salario*mesf;
            double dias_indenizacion_a_pagar=prom_salario*diaf;

            double indemnizacion = anos_indenizacion_a_pagar+meses_indenizacion_a_pagar+dias_indenizacion_a_pagar;
            indemnizacion=Math.round(indemnizacion*100)/100;
            html+="<td>"+indemnizacion+"</td>";
            planilla.setINDEMNIZACION(indemnizacion);

            Calendar calenda = new GregorianCalendar();
            calenda.set(Calendar.MONTH, 0);
            calenda.set(Calendar.DAY_OF_MONTH, 1);
            Date fecha1=calenda.getTime();
            Date fecha2=new GregorianCalendar().getTime();
            long diferencia = fecha2.getTime()-fecha1.getTime();
            int dias_tranajados_este_ano = (int)(diferencia/(3600000*24));

            double aguinaldo=0.0;
            if(dias_tranajados_este_ano>90)
            {
                int ano_comercial = new CON_DATOS_EMPRESA(con).Buscar().getANO_COMERCIAL();
                aguinaldo = (prom_salario/ano_comercial)*dias_tranajados_este_ano;
            }
            aguinaldo=Math.round(aguinaldo*100)/100;
            html+="<td>"+aguinaldo+"</td>";
            planilla.setAGUINALDO(aguinaldo);
            
            Calendar ano_ingreso = new GregorianCalendar();
            ano_ingreso.setTime(ingreso);
            int elano_ingreso = ano_ingreso.get(Calendar.YEAR);
            int ano_comercial = new CON_DATOS_EMPRESA(con).Buscar().getANO_COMERCIAL();

            double vacaciones_no_cobradas=0.0;                    
            int dias_vacaion_x_ano = 0;
            for (int i = 0; i <= anof; i++) 
            {
                int dias_vacaciones_tomadas = new RHH_VACACIONES(con).CANT_VACACIONES_TOMADAS_POR_AÑO(fecha.getID_USUARIO(), elano_ingreso);
                dias_vacaion_x_ano = new RHH_VACACIONES_PARAMETRIZACION(con).getHorasDeVacacion(i)/8;
                int dias_vacaciones_no_tomadas = dias_vacaion_x_ano-dias_vacaciones_tomadas;
                double vacacion=(dias_vacaciones_no_tomadas*ano_comercial);
                if(vacacion!=0)
                    vacacion = vacacion/dias_vacaion_x_ano;
                
                vacaciones_no_cobradas += vacacion;
            }

            int dias_ano_corrido = (mesf*30)+diaf;
            vacaciones_no_cobradas+=(dias_vacaion_x_ano*dias_ano_corrido)/ano_comercial;

            double factor_15_30 = new CON_DATOS_EMPRESA(con).Buscar().getFACTOR_15_30();

            double total_vacaciones_no_cobradas = ((prom_salario*factor_15_30)*vacaciones_no_cobradas)/ano_comercial;
            total_vacaciones_no_cobradas= Math.round(total_vacaciones_no_cobradas*100)/100;
            html+="<td>"+total_vacaciones_no_cobradas+"</td>";
            planilla.setVACACIONES_NO_COBRADAS(total_vacaciones_no_cobradas);
            double otro_ingreso=0.0;
            planilla.setOTROS_INGRESOS(otro_ingreso);
            double deducciones=0.0;
            planilla.setDEDUCCIONES(deducciones);
            double computo=0.0;
            planilla.setCOMPUTO_RCIVA_DDJJ(computo);
            html+="<td><input onblur='calcular_fila(this, "+fecha.getID()+");' type='number' value='"+otro_ingreso+"'/></td>";
            html+="<td><input onblur='calcular_fila(this, "+fecha.getID()+");' type='number' value='"+deducciones+"'/></td>";
            html+="<td><input onblur='calcular_fila(this, "+fecha.getID()+");' type='number' value='"+computo+"'/></td>";
            double descuento_rc_iva = total_vacaciones_no_cobradas+otro_ingreso;
            descuento_rc_iva=Math.round(descuento_rc_iva*100)/100;
            html+="<td>"+descuento_rc_iva+"</td>";
            
            double saldo_anterior = new RHH_CREDITO_FISCAL(con).MontoActual(planilla.getID_USUARIO());
            html+="<td>"+saldo_anterior+"</td>";
            planilla.setSALDO_MES_ANTERIOR(saldo_anterior);
            
            planilla.setIMPUESTO_RC_IVA(descuento_rc_iva);
            double monto_descontar_impuestos = ((descuento_rc_iva-computo)*0.13);
            monto_descontar_impuestos=Math.round(monto_descontar_impuestos*100)/100;                                    
            html+="<td>"+monto_descontar_impuestos+"</td>";
            
            double total_monto_descontar = monto_descontar_impuestos-saldo_anterior;
            if(total_monto_descontar<0)
                total_monto_descontar=0;            
            html+="<td>"+total_monto_descontar+"</td>";
            
            double saldo_mes_siguiente = computo+saldo_anterior-(descuento_rc_iva*0.13);
            if(saldo_mes_siguiente<0)
                saldo_mes_siguiente=0;
            
            html+="<td>"+saldo_mes_siguiente+"</td>";
            planilla.setSALDO_MES_SIGUIENTE(saldo_mes_siguiente);
            
            planilla.setTOTAL_MONTO_DESCONTAR_IMPUESTO(total_monto_descontar);
            planilla.setMONTO_A_DESCONTAR(monto_descontar_impuestos);
            double total_indemnizacion = desahucio+indemnizacion+aguinaldo+vacaciones_no_cobradas+otro_ingreso-deducciones-total_monto_descontar;
            total_indemnizacion=Math.round(total_indemnizacion*100)/100;
            html+="<td>"+total_indemnizacion+"</td>";
            planilla.setTOTAL_INDEMINIZACION(total_indemnizacion);
            html+="</tr>";
            planilla.Insertar();
        }
        return html;
    }
    private String calcular_fila(HttpServletRequest request, Conexion con) throws SQLException {
        
        int id_fec_hito = Integer.parseInt(request.getParameter("id_fec_hito"));
        RHH_FECHAS_HITO fecha = new RHH_FECHAS_HITO(con).Buscar(id_fec_hito);
        String html="";
        int id_motivo = Integer.parseInt(request.getParameter("id_motivo"));
        RHH_PLANILLA_FINIQUITO planilla = new RHH_PLANILLA_FINIQUITO(con).BuscarXid_Usuario(fecha.getID_USUARIO());
        if(planilla!=null)
        {            
            RHH_PERSONA per = new RHH_PERSONA(con).BuscarxID_Usuario(fecha.getID_USUARIO());
            List<RHH_EVENTOS_HITO> evento_list = new RHH_EVENTOS_HITO(con).TodosRetiro();            
            html+="<td>"+per.getCI()+"</td>";
            html+="<td>"+per.getPRIMER_NOMBRE()+" "+per.getSEGUNDO_NOMBRE()+"</td>";
            html+="<td>"+per.getPRIMER_APELLIDO()+" "+per.getSEGUNDO_APELLIDO()+"</td>";
            html+="<td>"+new RHH_FECHAS_HITO(con).BuscarxUsuarioEvento(3 ,fecha.getID_USUARIO()).getFECHA()+"</td>";
            html+="<td>"+fecha.getFECHA()+"</td>";
            html+="<td><select onchange='calcular_fila(this, "+fecha.getID()+");'>";
            for(RHH_EVENTOS_HITO evento:evento_list)
            {
                if(evento.getID()==id_motivo)
                    html+="<option value='"+evento.getID()+"' selected>"+evento.getDESCRIPCION()+"</option>";
                else
                    html+="<option value='"+evento.getID()+"'>"+evento.getDESCRIPCION()+"</option>";
            }
            html+="</select></td>";
            
            double bono_antiguedad=planilla.getBONO_ANTIGUEDAD();
            html+="<td>"+bono_antiguedad+"</td>";
            planilla.setMOTIVO(id_motivo);
            double salario = new RHH_FECHAS_HITO(con).salarioUsuario(fecha.getID_USUARIO());
            html+="<td>"+salario+"</td>";
            planilla.setSALARIO(salario);
            Calendar cal = new GregorianCalendar();
            
            double prom_salario = new RHH_PLANILLA_EMPLEADOS(con).Promedio3Salarios(fecha.getID_USUARIO(), (cal.get(Calendar.MONTH)+1), cal.get(Calendar.YEAR));
            double desahucio=0.0; 
            if(id_motivo==1)
            {                            
                desahucio=prom_salario*3;
                desahucio=Math.round(desahucio*100)/100;
                html+="<td>"+desahucio+"</td>";
            }
            else
            {
                html+="<td>"+desahucio+"</td>";                
            }

            planilla.setDESAHUCIO(desahucio);
            
            int cantidad_quinquenios=new RHH_QUINQUENIO(con).CantidadQuinquenios(fecha.getID_USUARIO());
            Calendar calendario = new GregorianCalendar();
            calendario.set(Calendar.YEAR,0);
            calendario.set(Calendar.MONTH,0);
            calendario.set(Calendar.DAY_OF_MONTH, 1);

            int anof = 0;
            int mesf = 0;
            int diaf = 0;
            Date ingreso = new RHH_FECHAS_HITO(con).BuscarxUsuarioEvento(3, fecha.getID_USUARIO()).getFECHAinDate();
            if(ingreso!=null)
            {
                Date fecha1=ingreso;
                Date fecha2=fecha.getFECHAinDate();
                long diferencia = fecha2.getTime()-fecha1.getTime();
                int dia = (int)(diferencia/(3600000*24));                           
                calendario.add(Calendar.DAY_OF_MONTH, dia);
                if(dia<365)
                    anof=0;
                else
                    anof=calendario.get(Calendar.YEAR);

                mesf = calendario.get(Calendar.MONTH);
                diaf = calendario.get(Calendar.DAY_OF_MONTH);
            }

            double anos_indenizacion_a_pagar=anof-(cantidad_quinquenios*5);            
            double meses_indenizacion_a_pagar=prom_salario*mesf;            
            double dias_indenizacion_a_pagar=prom_salario*diaf;

            double indemnizacion = anos_indenizacion_a_pagar+meses_indenizacion_a_pagar+dias_indenizacion_a_pagar;
            indemnizacion=Math.round(indemnizacion*100)/100;
            html+="<td>"+indemnizacion+"</td>";
            planilla.setINDEMNIZACION(indemnizacion);

            Calendar calenda = new GregorianCalendar();
            calenda.set(Calendar.MONTH, 0);
            calenda.set(Calendar.DAY_OF_MONTH, 1);
            Date fecha1=calenda.getTime();
            Date fecha2=new GregorianCalendar().getTime();
            long diferencia = fecha2.getTime()-fecha1.getTime();
            int dias_tranajados_este_ano = (int)(diferencia/(3600000*24));

            double aguinaldo=0.0;
            if(dias_tranajados_este_ano>90)
            {
                int ano_comercial = new CON_DATOS_EMPRESA(con).Buscar().getANO_COMERCIAL();
                aguinaldo = (prom_salario/ano_comercial)*dias_tranajados_este_ano;
            }
            aguinaldo=Math.round(aguinaldo*100)/100;
            html+="<td>"+aguinaldo+"</td>";
            planilla.setAGUINALDO(aguinaldo);

            Calendar ano_ingreso = new GregorianCalendar();
            ano_ingreso.setTime(ingreso);
            int elano_ingreso = ano_ingreso.get(Calendar.YEAR);
            int ano_comercial = new CON_DATOS_EMPRESA(con).Buscar().getANO_COMERCIAL();

            double vacaciones_no_cobradas=0.0;                    
            int dias_vacaion_x_ano = 0;
            for (int i = 0; i <= anof; i++) 
            {
                int dias_vacaciones_tomadas = new RHH_VACACIONES(con).CANT_VACACIONES_TOMADAS_POR_AÑO(fecha.getID_USUARIO(), elano_ingreso);
                dias_vacaion_x_ano = new RHH_VACACIONES_PARAMETRIZACION(con).getHorasDeVacacion(i)/8;
                int dias_vacaciones_no_tomadas = dias_vacaion_x_ano-dias_vacaciones_tomadas;
                double vacacion=(dias_vacaciones_no_tomadas*ano_comercial);
                if(vacacion!=0)
                    vacacion = vacacion/dias_vacaion_x_ano;
                
                vacaciones_no_cobradas += vacacion;
            }

            int dias_ano_corrido = (mesf*30)+diaf;
            vacaciones_no_cobradas+=(dias_vacaion_x_ano*dias_ano_corrido)/ano_comercial;

            double factor_15_30 = new CON_DATOS_EMPRESA(con).Buscar().getFACTOR_15_30();

            double total_vacaciones_no_cobradas = ((prom_salario*factor_15_30)*vacaciones_no_cobradas)/ano_comercial;
            total_vacaciones_no_cobradas=Math.round(total_vacaciones_no_cobradas*100)/100;
            html+="<td>"+total_vacaciones_no_cobradas+"</td>";
            planilla.setVACACIONES_NO_COBRADAS(total_vacaciones_no_cobradas);
            
            double otro_ingreso=Double.parseDouble(request.getParameter("otros_ingresos"));
            planilla.setOTROS_INGRESOS(otro_ingreso);
            double deducciones=Double.parseDouble(request.getParameter("deducciones"));
            planilla.setDEDUCCIONES(deducciones);
            double computo=Double.parseDouble(request.getParameter("computo_rc_iva"));
            planilla.setCOMPUTO_RCIVA_DDJJ(computo);
            html+="<td><input onblur='calcular_fila(this, "+fecha.getID()+");' type='number' value='"+otro_ingreso+"'/></td>";
            html+="<td><input onblur='calcular_fila(this, "+fecha.getID()+");' type='number' value='"+deducciones+"'/></td>";
            html+="<td><input onblur='calcular_fila(this, "+fecha.getID()+");' type='number' value='"+computo+"'/></td>";
            double descuento_rc_iva = total_vacaciones_no_cobradas+otro_ingreso;
            descuento_rc_iva=Math.round(descuento_rc_iva*100)/100;
            html+="<td>"+descuento_rc_iva+"</td>";
            planilla.setIMPUESTO_RC_IVA(descuento_rc_iva);
            double saldo_anterior = new RHH_CREDITO_FISCAL(con).MontoActual(planilla.getID_USUARIO());
            html+="<td>"+saldo_anterior+"</td>";
            planilla.setSALDO_MES_ANTERIOR(saldo_anterior);
            
            double monto_descontar_impuestos = ((descuento_rc_iva-computo)*0.13);
            monto_descontar_impuestos=Math.round(monto_descontar_impuestos*100)/100;                                    
            html+="<td>"+monto_descontar_impuestos+"</td>";                        
            
            double total_monto_descontar = monto_descontar_impuestos-saldo_anterior;
            if(total_monto_descontar<0)
                total_monto_descontar=0;
                                    
            html+="<td>"+total_monto_descontar+"</td>";
            
            double saldo_mes_siguiente = computo+saldo_anterior-(descuento_rc_iva*0.13);
            if(saldo_mes_siguiente<0)
                saldo_mes_siguiente=0;
            
            html+="<td>"+saldo_mes_siguiente+"</td>";
            planilla.setSALDO_MES_SIGUIENTE(saldo_mes_siguiente);
            
            planilla.setTOTAL_MONTO_DESCONTAR_IMPUESTO(total_monto_descontar);
            planilla.setMONTO_A_DESCONTAR(monto_descontar_impuestos);
            double total_indemnizacion = desahucio+indemnizacion+aguinaldo+vacaciones_no_cobradas+otro_ingreso-deducciones-total_monto_descontar;
            total_indemnizacion=Math.round(total_indemnizacion*100)/100;
            html+="<td>"+total_indemnizacion+"</td>";
            planilla.setTOTAL_INDEMINIZACION(total_indemnizacion);
            html+="</tr>";            
            planilla.Modificar();
        }
        return html;
    }

    private String abrir(int mes, int ano,int id_cabecera, Conexion con) throws SQLException {
        String mess ="";
        if(mes<10)
            mess="0"+mes;
        else
            mess=mes+"";         
        
        List<RHH_PLANILLA_FINIQUITO> lista = new RHH_PLANILLA_FINIQUITO(con).BuscarxCabecera(id_cabecera);
        String html="";        
        for(RHH_PLANILLA_FINIQUITO planilla:lista)
        {            
            RHH_PERSONA per = new RHH_PERSONA(con).BuscarxID_Usuario(planilla.getID_USUARIO());
            List<RHH_EVENTOS_HITO> evento_list = new RHH_EVENTOS_HITO(con).TodosRetiro();
            html+="<tr>";
            html+="<td>"+per.getCI()+"</td>";
            html+="<td>"+per.getPRIMER_NOMBRE()+" "+per.getSEGUNDO_NOMBRE()+"</td>";
            html+="<td>"+per.getPRIMER_APELLIDO()+" "+per.getSEGUNDO_APELLIDO()+"</td>";                            
            
            RHH_DEPARTAMENTO depto = new RHH_DEPARTAMENTO(con).BuscarXid(planilla.getDEPARTAMENTO());
            RHH_REGIONAL reg = new RHH_REGIONAL(con).BuscarXid(planilla.getREGIONAL());
            RHH_SUCURSAL suc = new RHH_SUCURSAL(con).BuscarXid(planilla.getSUCURSAL());
            
            if(depto!=null)
            {
                planilla.setDEPARTAMENTO((int)depto.getID());
                html+="<td>"+depto.getDESCRIPCION()+"</td>";
            }
            else
            {
                planilla.setDEPARTAMENTO(0);
                html+="<td>***</td>";
            }
            
            if(reg!=null)
            {
                planilla.setREGIONAL((int)reg.getID());
                html+="<td>"+reg.getDESCRIPCION()+"</td>";
            }
            else
            {
                planilla.setREGIONAL(0);
                html+="<td>***</td>";
            }
            
            if(suc!=null)
            {
                planilla.setSUCURSAL((int)suc.getID());
                html+="<td>"+suc.getDESCRIPCION()+"</td>";
            }
            else
            {
                planilla.setSUCURSAL(0);
                html+="<td>***</td>";
            }
            html+="<td>"+planilla.getFECHA_CONTRATACION()+"</td>";            
            html+="<td>"+planilla.getFECHA_RETIRO()+"</td>";            
            if(planilla.getMOTIVO()==1)
                html+="<td>DESPIDO</td>";            
            if(planilla.getMOTIVO()==2)
                html+="<td>RENUNCIA</td>";            
            if(planilla.getMOTIVO()==21)
                html+="<td>FINALIZACION CONTRATO</td>";                        
                                    
            html+="<td>"+planilla.getBONO_ANTIGUEDAD()+"</td>";            
            html+="<td>"+planilla.getSALARIO()+"</td>";            
            html+="<td>"+planilla.getDESAHUCIO()+"</td>";
            html+="<td>"+planilla.getINDEMNIZACION()+"</td>";            
            html+="<td>"+planilla.getAGUINALDO()+"</td>";                        
            html+="<td>"+planilla.getVACACIONES_NO_COBRADAS()+"</td>";            
            html+="<td>"+planilla.getOTROS_INGRESOS()+"</td>";
            html+="<td>"+planilla.getDEDUCCIONES()+"</td>";
            html+="<td>"+planilla.getCOMPUTO_RCIVA_DDJJ()+"</td>";            
            html+="<td>"+planilla.getIMPUESTO_RC_IVA()+"</td>";            
            html+="<td>"+planilla.getSALDO_MES_ANTERIOR()+"</td>";
            html+="<td>"+planilla.getMONTO_A_DESCONTAR()+"</td>";
            html+="<td>"+planilla.getTOTAL_MONTO_DESCONTAR_IMPUESTO()+"</td>";
            html+="<td>"+planilla.getSALDO_MES_SIGUIENTE()+"</td>";
            html+="<td>"+planilla.getTOTAL_INDEMINIZACION()+"</td>";            
            html+="</tr>";            
        }
        return html;
    }

    private String estado(HttpServletRequest request, Conexion con) throws SQLException {
        int ano=Integer.parseInt(request.getParameter("ano"));
        int mes=Integer.parseInt(request.getParameter("mes"));               
        RHH_PLANILLA_FINIQUITO_CABECE cabe = new RHH_PLANILLA_FINIQUITO_CABECE(con).Buscar(mes, ano);
        if(cabe!=null)
        {
            return cabe.getESTADO()+"";
        }
        else
            return "-1";
    }
    private String cerrar(HttpServletRequest request, Conexion con) throws SQLException {
        int ano=Integer.parseInt(request.getParameter("ano"));
        int mes=Integer.parseInt(request.getParameter("mes"));               
        RHH_PLANILLA_FINIQUITO_CABECE cabe = new RHH_PLANILLA_FINIQUITO_CABECE(con).Buscar(mes, ano);
        cabe.setESTADO(0);
        cabe.Modificar();
        List<RHH_PLANILLA_FINIQUITO> lista =new RHH_PLANILLA_FINIQUITO(con).BuscarxCabecera(cabe.getID());
        for(RHH_PLANILLA_FINIQUITO planilla:lista)
        {
            double debito = planilla.getIMPUESTO_RC_IVA()*0.13;
            double credito = planilla.getSALDO_MES_SIGUIENTE();
            RHH_CREDITO_FISCAL credito_fiscal = new RHH_CREDITO_FISCAL(con);
            credito_fiscal.setID_USUARIO(planilla.getID_USUARIO());
            credito_fiscal.setDEBITO(debito);
            credito_fiscal.setCREDITO(credito);
            credito_fiscal.Insertar();
            if(debito>credito)
            {
                credito_fiscal.setID_USUARIO(planilla.getID_USUARIO());
                double resto = debito-credito;
                credito_fiscal.setDEBITO(0);
                credito_fiscal.setCREDITO(resto);
                credito_fiscal.Insertar();
            }
        }
        return "true";
    }
}
